import _imports
import pyvisflow as pvf
import pandas as pd


# 准备数据
df = pd.read_excel('titanic_full.xlsx')

# 注意：目前 pyvision 还不能支持多层表头的 dataframe
by_sex = df.groupby('sex', as_index=False).agg({
    'survived': 'mean'
}).assign(survived=lambda df: (df['survived'] * 100).round(0))

by_age4sex = df.groupby(['sex', 'age'],
                        as_index=False).agg({'survived': 'count'})

# 使用 markdown 输出基本内容
pvf.markdown('''
# 泰坦尼克号数据可视化示例

泰坦尼克号是当时世界上体积最庞大、内部设施最豪华的客运轮船，有“永不沉没”的美誉。然而不幸的是，在它的处女航中，泰坦尼克号便遭厄运——它从英国南安普敦出发驶向美国纽约。1912年4月14日23时40分左右，泰坦尼克号与一座冰山相撞，造成右舷船艏至船中部破裂，五间水密舱进水。4月15日凌晨2时20分左右，泰坦尼克船体断裂成两截后沉入大西洋底3700米处。2224名船员及乘客中，1517人丧生，其中仅333具罹难者遗体被寻回。泰坦尼克号沉没事故为和平时期死伤人数最为惨重的一次海难，其残骸直至1985年才被再度发现，受到联合国教育、科学及文化组织的保护。


''')

# 下拉框，用来切换图表类型
chart_type_select = pvf.select('bar pie'.split())
chart_type_select.placeholder = '这里切换图表类型'

# 为了让2个图表并排放在一行，使用 cols 划分多列
col1, col2 = pvf.cols(2)

# 左边列创建 性别生还率的 bar 图
sex_chart = col1.echart(by_sex)
sex_chart.utils.use_bar(x='sex', y='survived')
# 下拉框的选项 联动到 图表的类型上
sex_chart.set_series(0,'type',chart_type_select.currentLabels[0]) 

# 下拉框的选项，联动到图表的标题
sex_chart.title = pvf.fns.ifelse(
    chart_type_select.currentLabels[0] == 'bar', '男女生还比例(柱状图)', '男女生还比例(饼图)')

# 显示一些联动信息，其中 sex 显示 性别生还率图标的点击信息
# 当鼠标点击图表中的某个系列时，就会输出性别
md = col1.markdown('''
你选中了{{sex}}
鼠标移过表格中的行中性别是：{{table_select}}
''',
                   sex=sex_chart.clickInfo['name'])

# 第二列
col2.markdown('年龄生还人数')

# 创建年龄生还个数 面积图
age_bar = col2.echart(by_age4sex)
age_bar.utils.use_line('age', 'survived').area_chart()
# 性别图的点击名字 与 年龄图的标题关联
age_bar.title = sex_chart.clickInfo['name']

# 输出表格
table = pvf.dataTable(df)
table.size = 'small'
table.page_size = 5

# 设置 面积图的联动
# 性别图点击，或者 鼠标划过表格上的行时，面积图的数据会按性别过滤
age_bar.filters((age_bar.data['sex'] == sex_chart.clickInfo['name'])
                | (age_bar.data['sex'] == table.rowHover['sex']))

# 之前设置的 markdown 的表格占位符，用于显示鼠标在表格上划过的性别信息
md.set(table_select=table.rowHover['sex'])

pvf.to_html('pyvison-泰坦尼克简单示例(控件、图表之间的联动).html')
